剑指Offer 15 输入一个链表,输出该链表中倒数第k个结点

题目描述

输入一个链表,输出该链表中倒数第k个结点

思路

  1. 最开始就是在想说从头开始找到第k个节点,后来发现人家是要找到倒数的;立马傻眼了;因为链表给的是单向的;而且没有尾节点你也不可能反向找啊;
  2. 书上的想法就油然而生了,因为我的链表只放了1,2,3三个节点,所以我就想一边遍历带两个指针,后一个开始比前一个晚2个元素;指向倒数第三个;然后一直到队尾;

    代码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    static public ListNode FindKthToTail(ListNode head,int k) {
    if (head==null||k<=0)
    return null;
    ListNode ahead = head;
    ListNode behind = head;
    for ( int i =0;i<k-1;i++)
    {
    if (ahead.next==null)
    return null;
    ahead=ahead.next;
    }
    while (ahead.next!=null)
    {
    ahead=ahead.next;
    behind=behind.next;
    }
    return behind;
    }

收获

  1. 人家讲书读百遍,其义自见;题多做了几道对于测试用例还是稍微敏感了一些
  2. 任何数据结构都是很厉害的啊;
  3. 好玩的;指针一快一慢就有各种用处,一个走两步,一个走一步就可以找到中间节点;一个走得快,一个走得慢就可以检验是否是循环链表了;